package com.zeta.demo.es.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zeta.demo.es.dao.PostMapper;
import com.zeta.demo.es.model.entity.Post;
import com.zeta.demo.es.service.IPostService;
import com.zeta.demo.es.service.es.IPostEsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.zetaframework.base.exception.BusinessException;

import java.util.List;

/**
 * 文章 服务实现类
 *
 * @author gcc
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements IPostService {

    private final IPostEsService esService;

    /**
     * 保存数据到数据库和es中
     *
     * @param entity 数据
     * @return 是否成功
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean customSave(Post entity) {
        // 保存到数据库
        if (!this.save(entity)) {
            throw new BusinessException("数据保存失败");
        }

        // 保存到ES, ps: mybatis plus会自动填充id到entity中
        if (!esService.saveOrUpdatePost(entity)) {
            throw new BusinessException("ES保存失败");
        }
        return true;
    }

    /**
     * 更新数据到数据库和es中
     *
     * @param entity 数据
     * @return 是否成功
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean customUpdate(Post entity) {
        // 更新数据库
        if (!this.updateById(entity)) {
            throw new BusinessException("数据更新失败");
        }

        // 更新es中的数据
        if (!esService.saveOrUpdatePost(entity)) {
            throw new BusinessException("ES更新失败");
        }
        return true;
    }

    /**
     * 删除数据库和es中的数据
     *
     * @param id id
     * @return 是否成功
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean customDeleteById(Long id) {
        // 删除数据库中的数据
        if (!this.removeById(id)) {
            throw new BusinessException("数据删除失败");
        }

        // 删除es中的数据
        if (!esService.removeById(id)) {
            throw new BusinessException("ES删除失败");
        }
        return false;
    }

    /**
     * 批量删除数据库和es中的数据
     *
     * @param batchIds ids
     * @return 是否成功
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean customBatchDeleteById(List<Long> batchIds) {
        // 批量删除数据库中的数据
        if (!this.removeByIds(batchIds)) {
            throw new BusinessException("数据删除失败");
        }

        // 批量删除es中的数据
        if (!esService.removeByIds(batchIds)) {
            throw new BusinessException("ES删除失败");
        }
        return false;
    }
}
